package com.shansun.util
{
	import mx.collections.IViewCursor;
	import mx.controls.Tree;
	import mx.controls.treeClasses.ITreeDataDescriptor;

	public class TreeUtil
	{
		public function TreeUtil()
		{
		}

		public static function walkTree(tree:Tree, item:Object, startAtParent:Boolean=false):void
		{
			// get the Tree's data descriptor
			var descriptor:ITreeDataDescriptor=tree.dataDescriptor;
			var cursor:IViewCursor;

			var parentItem:Object;
			var childItem:Object;
			var childItems:Object;

			// if the item is null, stop
			if (item == null)
				return;

			// do we back up one level to the item's parent
			if (startAtParent)
			{
				// get the parent
				parentItem=tree.getParentItem(item);
				// is the parent real
				if (parentItem)
				{
					trace("|-- Parent Node ", parentItem[tree.labelField]);
					// if the parent is a branch
					if (descriptor.isBranch(parentItem))
					{
						// if the branch has children to run through
						if (descriptor.hasChildren(parentItem))
						{
							// get the children of the branch
							// this part of the algorithm contains the item
							// passed
							childItems=descriptor.getChildren(parentItem);
						}
					}
					// if the branch has valid child items
					if (childItems)
					{
						// create our back step cursor
						cursor=childItems.createCursor();
						// loop through the items parent's children (item)
						while (!cursor.afterLast)
						{
							// get the current child item
							childItem=cursor.current;
							var label:String=childItem[tree.labelField];
							var branch:Boolean=descriptor.isBranch(childItem);

							// good place for a custom method()
							trace("Sibling Nodes :: ", label, "Is Branch :: ", branch);

							// if the child item is a branch
							if (descriptor.isBranch(childItem))
								// traverse the childs branch all the way down 
								// before returning
								walkTree(tree, childItem);
							// do it again!
							cursor.moveNext();
						}
					}
				}
			}
			else // we don't want the parent OR this is the second iteration
			{
				// if we are a branch
				if (descriptor.isBranch(item))
				{
					// if the branch has children to run through
					if (descriptor.hasChildren(item))
					{
						// get the children of the branch
						childItems=descriptor.getChildren(item);
					}

					// if the child items exist
					if (childItems)
					{
						// create our cursor pointer
						cursor=childItems.createCursor();
						// loop through all of the children
						// if one of these children are a branch we will recurse
						while (!cursor.afterLast)
						{
							// get the current child item
							childItem=cursor.current;

							var label:String=childItem[tree.labelField];
							var branch:Boolean=descriptor.isBranch(childItem);

							// good place for a custom method()
							trace("-- Sub Node :: ", label, "Is Branch :: ", branch);

							// if the child item is a branch
							if (descriptor.isBranch(childItem))
								// traverse the childs branch all the way down 
								// before returning
								walkTree(tree, childItem);
							// check the next child
							cursor.moveNext();
						}
					}
				}
			}
		}
	}
}